package com.douding.file.controller.admin;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.crypto.SecureUtil;
import com.douding.server.domain.File;
import com.douding.server.dto.FileDto;
import com.douding.server.dto.ResponseDto;

import com.douding.server.service.FileService;

import com.xr.aliyun.service.AliyunFileService;
import com.xr.common.utils.R;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;

@RestController
@RequestMapping("/admin/file")
public class OssController {

//    @Value("${file.path}")
//    private String FILE_PATH;

    private static final String FILE_PATH = "C:/Users/test-fzh/";

    @Value("${file.domain}")
    private String FILE_DOMAIN;

    @Resource
    private FileService fileService;

    @Resource
    private AliyunFileService aliyunFileService;

    // 文件上传方式一  上传到阿里云OSS存储桶（已测试通过）
//    @PostMapping("/oss-simple")
//    public ResponseDto fileUpload(@RequestParam("file") MultipartFile file, @RequestParam("use") String use) {
//        // 文件名
//        String fileName = file.getOriginalFilename();
//        // 文件类型
//        String suffix = FileUtil.extName(fileName);
//        // 文件大小（单位：B）
//        long size = file.getSize();
//        String key = null;
//
//        try {
//            // 获取文件的唯一性标识
//            key = SecureUtil.md5(file.getInputStream());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        // 将文件对象的记录存储到数据库
//        File fileInfo = new File();
//        fileInfo.setName(fileName);
//        String path;
//        if ("T".equals(use)) {
//            path = "teacher/" + fileName;
//            fileInfo.setPath(path);
//        } else {
//            path = "course/" + fileName;
//            fileInfo.setPath(path);
//        }
//        fileInfo.setSize((int) size);
//        fileInfo.setSuffix(suffix);
//        fileInfo.setKey(key);
//        fileInfo.setUse(use);
//        // 普通上传，将分片索引、分片数、分片大小设置为 0
//        fileInfo.setShardIndex(0);
//        fileInfo.setShardTotal(0);
//        fileInfo.setShardSize(0);
//        fileInfo.setCreatedAt(new Date());
//        fileInfo.setUpdatedAt(new Date());
//        FileDto fileDto = new FileDto();
//        BeanUtils.copyProperties(fileInfo, fileDto);
//        fileService.save(fileDto);
//        ResponseDto responseDto = new ResponseDto();
//
//        // 自定义第三方OSS上传，已有代码为jar包形式，自己独立封装的，发布到了Maven，可在Maven下载
//        R r = aliyunFileService.uploadFile(file);
//        String url = MapUtil.getStr(r, "data");
//
//        fileDto.setPath(url);
//        responseDto.setContent(fileDto);
//        return responseDto;
//    }

    // 文件上传方式二  上传到本地（静态资源读取）
    @PostMapping("/oss-simple")
    public ResponseDto fileUpload(@RequestParam("file") MultipartFile file, @RequestParam("use") String use) {
        // 文件名
        String fileName = file.getOriginalFilename();
        // 文件类型
        String suffix = FileUtil.extName(fileName);
        // 文件大小（单位：B）
        long size = file.getSize();

        // 创建一个新目录
        java.io.File dir = new java.io.File(FILE_PATH);
        // 判断当前目录是否存在
        if (!dir.exists()) {
            // 目录不存在，则创建
            dir.mkdirs();
        }
        java.io.File uploadFile = new java.io.File(FILE_PATH + fileName);
        // 上传文件到磁盘
        try {
            file.transferTo(uploadFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 获取文件的唯一性标识key
        String key = SecureUtil.md5(uploadFile);

        // 拼接文件URL
        String url = FILE_DOMAIN + fileName;

        // 将文件对象的记录存储到数据库
        File fileInfo = new File();
        fileInfo.setName(fileName);
        String path;
        if ("T".equals(use)) {
            path = "teacher/" + fileName;
            fileInfo.setPath(path);
        } else {
            path = "course/" + fileName;
            fileInfo.setPath(path);
        }
        fileInfo.setSize((int) size);
        fileInfo.setSuffix(suffix);
        fileInfo.setKey(key);
        fileInfo.setUse(use);
        // 普通上传，将分片索引、分片数、分片大小设置为 0
        fileInfo.setShardIndex(0);
        fileInfo.setShardTotal(0);
        fileInfo.setShardSize(0);
        fileInfo.setCreatedAt(new Date());
        fileInfo.setUpdatedAt(new Date());
        FileDto fileDto = new FileDto();
        BeanUtils.copyProperties(fileInfo, fileDto);
        fileService.save(fileDto);
        ResponseDto responseDto = new ResponseDto();
        // 设置文件URL
        fileDto.setPath(url);
        responseDto.setContent(fileDto);
        return responseDto;
    }

}
